/**
 * Fichier FabriqueDaoJpa.java : Définition de classe
 * fr.unice.gnpt.core.dao.factory.FabriqueDaoDb4o : Fabrique de DAO pour JPA
 * 
 * Auteurs : Groupe GNPT : Gastinel, Nicolas, Pellegrino, Trovato
 */
package fr.unice.gnpt.core.dao.factory;

import java.util.Properties;

import fr.unice.gnpt.core.dao.DaoCours;
import fr.unice.gnpt.core.dao.DaoEnseignant;
import fr.unice.gnpt.core.dao.DaoService;
import fr.unice.gnpt.core.dao.jpa.JpaDaoCours;
import fr.unice.gnpt.core.dao.jpa.JpaDaoEnseignant;
import fr.unice.gnpt.core.dao.jpa.JpaDaoService;
import fr.unice.gnpt.core.util.Parametres;

/**
 * Classe gérant la fabrique de DAO pour JPA.
 * 
 * @author gnpt
 * @version 0.1.4
 */
public class FabriqueDaoJpa extends FabriqueDao {
	private Properties proprietesConnexion;

	/**
	 * Constructeur par défaut.
	 */
	public FabriqueDaoJpa() {
		super();

		this.proprietesConnexion = this.getProprietesJpa(Parametres
				.getParametres().getProperties());
	}

	/**
	 * Renvoie un nouveau DAO de type Cours pour JPA.
	 * 
	 * @see fr.unice.gnpt.core.dao.factory.FabriqueDao#getDaoCours()
	 * @return un nouveau DAO de type Cours pour JPA.
	 */
	@Override
	public DaoCours getDaoCours() {
		return new JpaDaoCours(this.proprietesConnexion);
	}

	/**
	 * Renvoie un nouveau DAO de type Enseignant pour JPA.
	 * 
	 * @see fr.unice.gnpt.core.dao.factory.FabriqueDao#getDaoService()
	 * @return un nouveau DAO de type Enseignant pour JPA.
	 */
	@Override
	public DaoEnseignant getDaoEnseignant() {
		return new JpaDaoEnseignant(this.proprietesConnexion);
	}

	/**
	 * Renvoie un nouveau DAO de type Service pour JPA.
	 * 
	 * @see fr.unice.gnpt.core.dao.factory.FabriqueDao#getDaoService()
	 * @return un nouveau DAO de type Service pour JPA.
	 */
	@Override
	public DaoService getDaoService() {
		return new JpaDaoService(this.proprietesConnexion);
	}

	/**
	 * On crée un nouvel objet Properties contenant les associations clé/valeur
	 * dont JPA a besoin (pour établir une connexion à la base de données) à
	 * partir des propriétés lues dans le fichier de configuration.
	 * 
	 * @return les propriétés dont JPA a besoin pour se connecter à la base de
	 *         données.
	 */
	private Properties getProprietesJpa(Properties defaut) {
		Properties jpaProperties = new Properties();
		String driver = null;
		StringBuffer url = new StringBuffer();
		String serverType = defaut.getProperty("jpa.server.type").toLowerCase();

		if (serverType.equals("oracle")) {
			driver = "oracle.jdbc.OracleDriver";
			url.append("jdbc:oracle:thin:@");
			url.append(defaut.getProperty("jpa.server") + ":");
			url.append(defaut.getProperty("jpa.port") + ":");
			url.append(defaut.getProperty("jpa.database"));
		} else if (serverType.equals("mysql")) {
			driver = "com.mysql.jdbc.Driver";
			url.append("jdbc:mysql://");
			url.append(defaut.getProperty("jpa.server") + "/");
			url.append(defaut.getProperty("jpa.database"));
		}

		// Driver à utiliser
		jpaProperties.put("toplink.jdbc.driver", driver);
		// URL du server
		jpaProperties.put("toplink.jdbc.url", url.toString());
		// Nom d'utilisateur
		jpaProperties.put("toplink.jdbc.user", defaut.getProperty("jpa.user"));
		// Mot de passe
		jpaProperties.put("toplink.jdbc.password", defaut
				.getProperty("jpa.pass"));
		// Type de génération
		jpaProperties.put("toplink.ddl-generation", "create-tables");
		// Type d'affichage de debug
		jpaProperties.put("toplink.logging.level", "OFF");

		return jpaProperties;
	}
}
